การรัน SQL ไปยังไฟล์ใน S3 ด้วย Glue กับ Athena บน AWS
※บทความนี้เป็นบทความเก่า เนื่องจาก UI เปลี่ยนแปลงไปมาก ดังนั้นโปรดดูบทความใหม่ที่ลิงก์ด้านล่างนี้
・การรัน SQL ไปยังไฟล์ใน S3 ด้วย Glue กับ Athena บน Amazon Linux 2023
สวัสดีครับ ครั้งนี้ผมจะมาอธิบายเกี่ยวกับการรัน SQL ไฟล์ S3 ด้วย Glue กับ Athena ต่อจากบทความ วิธีการใช้ S3 จาก EC2 และการใช้ AWS CLI S3 เพื่อใช้ในการตรวจสอบข้อมูลที่มีการอัปโหลดเข้ามาใน S3 ครับ ก่อนอื่นเรามาดูภาพรวมของขั้นตอนการทำทั้งหมดในบทความนี้กันครับ
- ภาพรวมของขั้นตอนการทำทั้งหมด
- ตั้งค่าการสร้างและอัปโหลดไฟล์ JSON ไปยัง S3 ทุกๆ 1 นาทีโดยอัตโนมัติ
นี่คือการเตรียม EC2 สำหรับการอัปโหลดไฟล์ไปยัง S3 และเรียกใช้ python 1 ครั้งโดยใช้ cron ทุกๆ 1 นาทีเช่นกัน ซึ่ง python จะทำการสร้างไฟล์ JSON แบบสุ่มโดยอัตโนมัติ -
เตรียมพร้อมการเรียกใช้ SQL ไปยังไฟล์ที่มีอยู่ใน S3 (AWS Glue)
เรียกใช้ Glue สำหรับไฟล์ที่มีอยู่ใน S3 และสร้าง Database กับ Table เพื่อให้สามารถ Call ด้วย SQL ได้ -
รัน SQL สำหรับ Table (Amazon Athena)
เตรียมพร้อมที่จะเริ่มใช้ Athena หลังจากนั้นให้รัน SQL ด้วย Query Editor ของ Athena -
ทำวิธีการลบ AWS Resource ที่สร้างขึ้นในบทความนี้
Service ที่ใช้ในบทความนี้คือ:
- Amazon S3
- Buckets (2)
- AWS Identity and Access Management (IAM)
- Roles (2)
- Amazon EC2
- Key Pairs
- Instance
- Security Groups
- AWS Glue
- Databases
- Tables
- Crawlers
- Amazon Athena
- Workgroups
โปรแกรมที่ใช้ในบทความนี้คือ:
- PuTTY
สิ่งที่ต้องมี
ขั้นตอนอาจจะซับซ้อนนิดนึง แนะนำให้เพื่อนๆ ลองอ่านรายละเอียดให้ดีก่อนลงมือทำในแต่ละขั้นตอน เพื่อป้องกันความผิดพลาดนะครับ
ขั้นแรกให้สร้าง S3 ขึ้นมา จากนั้นสร้าง EC2 ที่เชื่อมต่อกับ Role และสามารถเข้าถึง S3 ได้เตรียมไว้ โดยผมจะระบุรายละเอียดขั้นตอนการสร้างและแปะลิงก์ที่ด้านล่างนี้ครับ
- S3 Buckets ที่สร้างเสร็จแล้ว
- EC2 ที่เชื่อมต่อกับ Role และสามารถเข้าถึง S3 ได้
เมื่อติดตั้ง S3 และ EC2 เสร็จเรียบร้อยแล้ว ให้ทดสอบการเข้าถึง S3 โดยการดูข้อมูลใน S3 ผ่านคำสั่ง AWS CLI และเปลี่ยน Time Zone EC2 ดังนี้ครับ
- ทดสอบการดูข้อมูลใน S3สามารถดูข้อมูลเพิ่มเติมได้ที่: ตรวจสอบข้อมูล S3 ใน Server Amazon Linux 2
รันคำสั่งของ AWS CLI S3 เพื่อดูข้อมูลใน S3 โดยใช้คำสั่งaws s3 ls s3://
+bucket_name
ของคุณ
aws s3 ls s3://tinnakorn-test-s3
Output
ถ้าไม่ขึ้น Error และแสดงหน้าจอเหมือนด้านล่างนี้ก็ทำขั้นตอนถัดไปได้เลยครับ
[root@ip-172-31-30-143 ~]# aws s3 ls s3://tinnakorn-test-s3
[root@ip-172-31-30-143 ~]#
- เปลี่ยน Time Zone EC2สามารถดูข้อมูลเพิ่มเติมได้ที่: วิธีตั้งค่า Time Zone ใน Amazon Linux 2 ของ EC2
รันคำสั่งนี้เพื่อตรวจสอบเวลาปัจจุบัน
date
Output
[root@ip-172-31-30-143 ~]# date
Mon Jun 13 08:03:51 UTC 2022
รันคำสั่งนี้เพื่อเปลี่ยนเวลาจาก UTC ให้เป็น +07
ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime date
Output
จะเห็นว่าเวลาปัจจุบันเป็น +07 เรียบร้อยแล้วครับ
[root@ip-172-31-30-143 ~]# ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime
[root@ip-172-31-30-143 ~]# date
Mon Jun 13 15:05:46 +07 2022
[root@ip-172-31-30-143 ~]#
เพียงเท่านี้การเตรียม S3 และ EC2 ก็เสร็จเรียบร้อยครับ
1. ตั้งค่าการสร้างและอัปโหลดไฟล์ JSON ไปยัง S3 ทุกๆ 1 นาทีโดยอัตโนมัติ
การสร้างไฟล์ Python
ขั้นตอนนี้เป็นการสร้าง Python โดยให้ไฟล์ที่จะสร้างนี้อัปโหลดไปยัง S3 ตามเวลาที่เรากำหนดโดยอัตโนมัติ ! เมื่อพร้อมแล้วมาเริ่มกันเลยครับ
รันคำสั่งนี้เพื่อตรวจสอบเวอร์ชัน Python ที่อยู่ใน EC2
python3 --version
Output
โดยปกติแล้ว python จะมีอยู่ใน EC2 ให้อยู่แล้วครับ
[root@ip-172-31-30-143 ~]# python3 --version
Python 3.7.10
[root@ip-172-31-30-143 ~]#
สำหรับผู้ใช้งานที่ตรวจสอบเวอร์ชันแล้ว กรณีที่ไม่มี python ตามที่กล่าวไว้ ให้รันคำสั่งด้านล่างนี้เพื่อติดตั้งได้เลยครับ
ผู้ใช้งานที่มีอยู่แล้ว ให้ข้ามขั้นตอนนี้ไปได้เลยครับ
yum install python3 -y
รันคำสั่งนี้เพื่อดาวน์โหลดไฟล์ Python
wget https://raw.githubusercontent.com/classmethod-thailand/cmth_seminar/develop/s3_athena_material/create_sample_json_upload_s3.py
Output
[root@ip-172-31-30-143 ~]# wget https://raw.githubusercontent.com/classmethod-thailand/cmth_seminar/develop/s3_athena_material/create_sample_json_upload_s3.py
--2022-06-13 15:46:25-- https://raw.githubusercontent.com/classmethod-thailand/cmth_seminar/develop/s3_athena_material/create_sample_json_upload_s3.py
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 669
Saving to: ‘create_sample_json_upload_s3.py’
100%[==========================================================================================>] 669 --.-K/s in 0s
2022-06-13 15:46:25 (36.7 MB/s) - ‘create_sample_json_upload_s3.py’ saved [669/669]
[root@ip-172-31-30-143 ~]#
รันคำสั่งนี้เพื่อเข้ามาที่ไฟล์create_sample_json_upload_s3.py
และเปลี่ยนชื่อ s3_bucket_name ในขั้นตอนถัดไป
vi create_sample_json_upload_s3.py
เมื่อเข้ามาที่ตัวไฟล์แล้วทำการเปลี่ยนชื่อ s3_bucket_name ให้เป็นชื่อ Bucket ของเรา
ดูตัวอย่าง Code ที่นี่: create_sample_json_upload_s3.py
- วิธีเปลี่ยนชื่อ s3_bucket_name
- กดปุ่ม
i
ที่แป้นพิมพ์ ให้"create_sample_json_upload_s3.py" 26L, 669B
ที่อยู่ด้านล่างซ้ายเปลี่ยนเป็น--INSERT--
- หาคำว่า
s3_bucket_name
แล้วคัดลอก Bucket ของเราที่สร้างไว้ก่อนหน้านี้มาใส่แทนชื่อเก่า เช่น ในบทความนี้คือชื่อtinnakorn-test-s3
เป็นต้น
- เมื่อเปลี่ยนชื่อ s3_bucket_name เสร็จแล้วทำการ Save ตามนี้
- กดปุ่ม
Esc
ให้--INSERT--
หายไป- จากนั้นพิมพ์
:x
หรือ:wq
+ Enter
รันคำสั่งนี้เพื่ออัปโหลดไฟล์ JSON ไปยัง S3
python3 create_sample_json_upload_s3.py
Output
เมื่อรันคำสั่งนี้ไปแล้ว ตัวไฟล์ JSON จะถูกอัปโหลดขึ้นไปที่ S3 ครับ
[root@ip-172-31-30-143 ~]# python3 create_sample_json_upload_s3.py
upload: ./20220614_140411.json to s3://tinnakorn-test-s3/20220614/20220614_140411.json
[root@ip-172-31-30-143 ~]#
เข้ามาที่ S3 Bucket ของเรา แล้วทำการ Reload จะเห็นว่ามีไฟล์เพิ่มขึ้นมา คลิกเข้ามาที่โฟลเดอร์ตามวันที่ปัจจุบัน
ทีนี้ให้ทำการดาวน์โหลดไฟล์ JSON โดยติ๊ก✅
ไฟล์ที่ต้องการดาวน์โหลด แล้วกดปุ่มDownload
ได้เลยครับ
เปิดดูไฟล์ด้วยโปรแกรม Notepad ของ Windows ได้เลย ซึ่งข้อมูลจะแสดงตามรูปภาพด้านล่างครับ
รันคำสั่งนี้เพื่ออัปโหลดไฟล์ JSON ไปยัง S3 อีกครั้ง
python3 create_sample_json_upload_s3.py
Output
เมื่อรันคำสั่งนี้ไปแล้ว ตัวไฟล์ Python จะสร้างและอัปโหลดไฟล์ JSON ขึ้นไปที่ S3 ครับ
[root@ip-172-31-30-143 ~]# python3 create_sample_json_upload_s3.py
upload: ./20220614_140605.json to s3://tinnakorn-test-s3/20220614/20220614_140605.json
[root@ip-172-31-30-143 ~]#
เข้ามาที่ S3 Bucket ของเราอีกครั้ง แล้วทำการ Reload จะเห็นว่ามีไฟล์ JSON อันที่ 2 เพิ่มขึ้นมา แล้วทำการดาวน์โหลดไฟล์ JSON อีกครั้งครับ
เปิดดูไฟล์ด้วยโปรแกรม Notepad ของ Windows อีกครั้ง ทีนี้ลองเปิดเทียบกันดู จะเห็นว่าเวลาจะต่างกันตามระยะเวลาที่เราทำการอัปโหลดไป และ distance ก็จะได้ตัวเลขที่สุ่มออกมาแบบนี้ครับ
ขั้นตอนต่อไปจะเป็นการแก้ไขไฟล์ crontab เพื่อที่จะทำให้สามารถอัปโหลดไฟล์ JSON ไปยัง S3 ได้โดยอัตโนมัติ
รันคำสั่งนี้เพื่อเข้ามาที่ไฟล์ crontab และทำการเพิ่ม Code ในขั้นตอนถัดไป
vi /etc/crontab
ทีนี้เรามาแก้ไขไฟล์ crontab โดยการเพิ่ม Code ตามนี้
» กดปุ่มi
ให้คำว่า"/etc/crontab" 15L, 451B
ที่อยู่ด้านล่างซ้ายเปลี่ยนเป็น-- INSERT --
» Copy Code ด้านล่างนี้ และนำไปวางที่บรรทัดถัดไปของ# * * * * * user-name command to be executed
* * * * * root /usr/bin/python3 /root/create_sample_json_upload_s3.py
root@ip-172-31-30-143:~
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
* * * * * root /usr/bin/python3 /root/create_sample_json_upload_s3.py // วาง Code ที่นี่
~
~
~
~
~
-- INSERT -- 15,70 All
เมื่อเพิ่ม Code เสร็จแล้วทำการ Save ตามนี้
» กดปุ่มEsc
ให้คำว่า-- INSERT --
ที่อยู่ด้านล่างซ้ายหายไป
» พิมพ์:x
หรือ:wq
+ Enter
root@ip-172-31-30-143:~
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
* * * * * root /usr/bin/python3 /root/create_sample_json_upload_s3.py
~
~
~
~
~
:x
เมื่อเสร็จสิ้นจากการเพิ่ม Code แล้ว หลังจากนี้ตัวไฟล์ Python จะทำการสร้างและอัปโหลดไฟล์ JSON ขึ้นไปที่ S3 โดยอัตโนมัติทุกๆ 1 นาทีครับ
ต่อไปรันคำสั่งนี้ทันทีเพื่อตรวจสอบการทำงานของไฟล์ crontab
tail -f /var/log/cron
Output
เมื่อได้หน้าจอแบบนี้แล้วรอ 1 นาที
[root@ip-172-31-30-143 ~]# tail -f /var/log/cron
Jun 14 14:01:01 ip-172-31-30-143 run-parts(/etc/cron.hourly)[5372]: finished 0anacron
Jun 14 14:10:01 ip-172-31-30-143 CROND[5411]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:18:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:18:01 ip-172-31-30-143 CROND[5430]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:19:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:20:01 ip-172-31-30-143 CROND[5451]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:23:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:23:01 ip-172-31-30-143 CROND[5464]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:24:01 ip-172-31-30-143 CROND[5481]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:25:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
เมื่อครบ 1 นาทีแล้ว จะเปลี่ยนเป็นแบบนี้โดยให้สังเกตเวลาปัจจุบัน เช่นJun 14 14:29:01
[root@ip-172-31-30-143 ~]# tail -f /var/log/cron
Jun 14 14:01:01 ip-172-31-30-143 run-parts(/etc/cron.hourly)[5372]: finished 0anacron
Jun 14 14:10:01 ip-172-31-30-143 CROND[5411]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:18:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:18:01 ip-172-31-30-143 CROND[5430]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:19:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:20:01 ip-172-31-30-143 CROND[5451]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:23:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:23:01 ip-172-31-30-143 CROND[5464]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:24:01 ip-172-31-30-143 CROND[5481]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:25:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:29:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:29:01 ip-172-31-30-143 CROND[5554]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
เข้ามาที่ S3 Bucket จะเห็นว่ามีไฟล์ JSON อันที่ 3 เพิ่มขึ้นมาโดยอัตโนมัติ
และหลังจากนี้ไฟล์ JSON ก็จะถูกสร้างและอัปโหลดไปที่ S3 เรื่อยๆ ทุกๆ 1 นาที สมมุติเวลาผ่านไปแล้ว 5 นาที ไฟล์ก็จะถูกอัปโหลดไป 5 ไฟล์ตามเวลาตัวอย่างด้านล่างนี้ครับ
Jun 14 14:30:01
Jun 14 14:31:01
Jun 14 14:32:01
Jun 14 14:33:01
Jun 14 14:34:01
root@ip-172-31-30-143:~
[root@ip-172-31-30-143 ~]# tail -f /var/log/cron
Jun 14 14:01:01 ip-172-31-30-143 run-parts(/etc/cron.hourly)[5372]: finished 0anacron
Jun 14 14:10:01 ip-172-31-30-143 CROND[5411]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:18:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:18:01 ip-172-31-30-143 CROND[5430]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:19:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:20:01 ip-172-31-30-143 CROND[5451]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:23:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:23:01 ip-172-31-30-143 CROND[5464]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:24:01 ip-172-31-30-143 CROND[5481]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:25:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:29:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:29:01 ip-172-31-30-143 CROND[5554]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:30:01 ip-172-31-30-143 CROND[5574]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:30:01 ip-172-31-30-143 CROND[5575]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:31:01 ip-172-31-30-143 CROND[5594]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:32:01 ip-172-31-30-143 CROND[5608]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:33:01 ip-172-31-30-143 CROND[5622]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:34:01 ip-172-31-30-143 CROND[5636]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
เข้ามาที่ S3 Bucket อีกครั้ง จะเห็นว่ามีไฟล์ JSON เพิ่มขึ้นมาใหม่ 5 ไฟล์โดยอัตโนมัติ
ในส่วนของหัวข้อ 1. ตั้งค่าการสร้างและอัปโหลดไฟล์ JSON ไปยัง S3 ทุกๆ 1 นาทีโดยอัตโนมัติ นี้ก็เสร็จเรียบร้อยแล้ว ผมจะทบทวนสิ่งที่ได้ทำมาจนถึงตอนนี้อีกครั้งครับ
- สิ่งที่ได้ทำไปแล้วในหัวข้อ 1. ตั้งค่าการสร้างและอัปโหลดไฟล์ JSON ไปยัง S3 ทุกๆ 1 นาทีโดยอัตโนมัติ
- ดาวน์โหลดไฟล์ Python
- เปลี่ยนชื่อ s3_bucket_name ในไฟล์ Python:
create_sample_json_upload_s3.py
- รันคำสั่ง Python3 โดยใช้ไฟล์ Python เพื่อสร้างและอัปโหลดไฟล์ JSON ไปยัง S3
- แก้ไขไฟล์ crontab โดยการเพิ่ม Code ที่สามารถทำให้สร้างและอัปโหลดไฟล์ JSON ไปยัง S3 ทุกๆ 1 นาทีได้โดยอัตโนมัติ
เมื่อเข้าใจวิธีการจัดการไฟล์ Python เพื่อสร้างและอัปโหลดไฟล์ JSON ไปยัง S3 โดยอัตโนมัติแล้ว ให้เริ่มทำหัวข้อถัดไปได้เลยครับ
2. เตรียมพร้อมการเรียกใช้ SQL ไปยังไฟล์ที่มีอยู่ใน S3 (AWS Glue)
ขั้นตอนนี้ผมจะสร้าง Database กับ Table เพื่อรันคำสั่ง SQL จาก Athena โดยใช้ฟังก์ชัน Crawler ของ AWS Glue ครับ ! เรามาเริ่มกันเลย
การสร้าง Databases
Database name:tinnakorn-test
คลิกCreate
เมื่อสร้างเสร็จจะได้ Database ตามชื่อของเรา
การสร้าง Crawlers
- Crawler info:
Crawler name:tinnakorn-test
(ชื่ออะไรก็ได้) คลิกNext
- Crawler source type:
ไม่ต้องตั้งค่า คลิกNext
ได้เลยครับ
- Data store:
Choose a data store:S3
Include path: คลิกที่ไอคอนโฟลเดอร์
เลือก S3 Bucket ที่อัปโหลดข้อมูลจาก EC2 เช่น +◉tinnakorn-test-s3 และคลิกSelect
- IAM Role:
IAM Role: AWSGlueServiceRole-tinnakorn-test
(ชื่ออะไรก็ได้) คลิกNext
- Schedule:
- Output:
เลือก Database:tinnakorn-test
ที่สร้างขึ้นเมื่อสักครู่นี้ และคลิกNext
- Review all steps:
เลื่อนลงมาด้านล่างสุด คลิกปุ่มFinish
เมื่อคลิกปุ่ม Finish แล้วจะแสดงหน้าจอแบบนี้
การ Run crawler
ขั้นตอนนี้ผมจะทำการ Run crawler เพื่อสร้าง Table ไปยัง Database
จากนั้นรอการสร้าง Table สักครู่ จนกว่า Status:Starting
เปลี่ยนเป็น Status:Ready
ครับ
เมื่อเปลี่ยนเป็น Status:Ready
แล้ว ให้เข้าไปดู Table ของเราในขั้นตอนถัดไปครับ
เมื่อเข้ามาแล้วก็จะเห็น Table ของเรา ซึ่ง Table นี้ถูกสร้างมาจากตอนที่เราทำการ Run crawler นั่นเอง
เปลี่ยน datetime ให้เป็น timestamp ใน Schema
ขั้นตอนนี้ผมจะทำการเปลี่ยน datetime:string
ให้เป็น datetime:timestamp
ครับ
เลื่อนลงมาด้านล่างสุดที่หัวข้อ Schema
จะเห็นว่า datetime เป็นstring
ซึ่งเราต้องแก้ไขในส่วนนี้ให้เป็นtimestamp
ครับ
มาที่มุมขวาบน คลิกปุ่มEdit schema
เลือก Column type:timestamp
และคลิกUpdate
ตรวจสอบที่หัวข้อ Schema อีกครั้ง จะเห็นว่า datetime เปลี่ยนเป็นtimestamp
เรียบร้อยแล้ว
ในส่วนของ Schema นี้คือ เวลาที่ไฟล์ JSON ถูกอัปโหลดไปที่ S3
ไฟล์ JSON จะถูกอ่านข้อมูลดังนี้
Column name | Data type | JSON | Description |
---|---|---|---|
distance | double | 1.2209623484355958 | ข้อมูลประเภทตัวเลขทศนิยม |
datetime | timestamp | 2022-06-14 14:06:05 | ข้อมูลวันที่และเวลา |
เวลาที่ไฟล์ JSON ถูกอัปโหลดไปที่ S3 ตัวฟังก์ชัน Crawlers จะทำการตรวจสอบไฟล์ที่มีอยู่ใน S3 ว่าเป็นไฟล์แบบไหน จะต้องสร้าง Table ยังไง จากนั้น Crawlers จะทำการรวบรวมข้อมูลเพื่อตัดสินใจและสร้าง Table มาให้โดยอัตโนมัติ ซึ่งฟังก์ชัน Crawlers นี้คือการทำงานของ AWS Glue นั่นเอง
ทีนี้ผมจะเทียบ Schema กับไฟล์ JSON ให้เห็นตำแหน่งของข้อมูลได้ชัดเจนมากขึ้นโดยดูจากรูปด้านล่างได้เลยครับ
ในส่วนของหัวข้อ 2. เตรียมพร้อมการเรียกใช้ SQL ไปยังไฟล์ที่มีอยู่ใน S3 (AWS Glue) นี้ก็เสร็จเรียบร้อยแล้ว ผมจะทบทวนสิ่งที่ได้ทำในหัวข้อนี้อีกครั้งครับ
- สิ่งที่ได้ทำไปแล้วในหัวข้อ 2. เตรียมพร้อมการเรียกใช้ SQL ไปยังไฟล์ที่มีอยู่ใน S3 (AWS Glue)
- สร้าง Databases
- สร้าง Crawlers
- ทำการ Run crawler เพื่อสร้าง Table ไปยัง Database โดยอัตโนมัติ
- เปลี่ยน datetime ให้เป็น timestamp ใน Schema
เมื่อสร้างทุกอย่างตามที่ระบุไว้แล้ว ให้เริ่มทำหัวข้อถัดไปได้เลยครับ
3. รัน SQL สำหรับ Table (Amazon Athena)
Amazon Athena คืออะไร
Amazon Athena เป็นบริการการสืบค้นแบบโต้ตอบที่ช่วยให้ง่ายต่อการวิเคราะห์ข้อมูลใน Amazon S3 โดยใช้ SQL มาตรฐาน Athena ไร้เซิร์ฟเวอร์ จึงไม่มีโครงสร้างพื้นฐานในการจัดการ และคุณจ่ายเฉพาะการสืบค้นที่คุณใช้งานเท่านั้น
การสร้าง S3 Bucket เพื่อบันทึกข้อมูลการรันคำสั่งของ Athena
ผมจะสร้าง S3 Bucket อันที่ 2 ขึ้นมาเพื่อบันทึกข้อมูลการรันคำสั่งของ Athena
ดูตัวอย่างที่นี่: การสร้าง Buckets ใน Amazon S3
รายละเอียดการสร้าง S3 Bucket อันที่ 2 ในบทความนี้คือ:
Bucket name:tinnakorn-test-athena-result
เมื่อสร้างเสร็จแล้วผมก็จะมี S3 Bucket ทั้งหมด 2 อัน ซึ่ง S3 Bucket ที่ใช้สำหรับ Athena จะอธิบายในภายหลังครับ
การสร้าง Workgroups
ขั้นตอนนี้ผมจะทำการสร้าง Workgroups ขึ้นมาเชื่อมต่อกับ S3 Bucket ที่ใช้สำหรับ Athena และตั้งค่า Query editor เพื่อใช้ในการรันคำสั่ง SQL ครับ
Workgroup name:tinnakorn-test
(ชื่ออะไรก็ได้)
มาที่หัวข้อ Query result configuration คลิกBrowse S3
เลือก Bucket ของ Athena ที่สร้างไปเมื่อสักครู่นี้ ในบทความนี้คือtinnakorn-test-athena-result
และคลิกChoose
เลื่อนลงมาด้านล่างสุด คลิกCreate workgroup
การตั้งค่า Query editor
มาที่มุมขวาบน เลือก Workgroup:tinnakorn-test
มาที่หัวข้อ Editor ดูที่ช่อง Data ด้านซ้าย แล้วทำการตั้งค่าพื้นฐานดังนี้
เลือก Database:tinnakorn-test
ดูที่ Table แล้วคลิก+
ที่ชื่อของเรา คือต้องมี distance และ datatime แสดงอยู่ที่นี่ ก็ถือว่าขั้นตอนทั้งหมดถูกต้อง
ทดสอบการใช้งาน SQL ใน Query editor
ขั้นตอนนี้ผมลองใช้งาน Query editor ในการรันคำสั่ง SQL เพื่อจัดการ Database ที่รวบรวมข้อมูลมาจาก S3 Bucket ที่เชื่อมต่อกับ EC2 ครับ
มาที่ช่อง Query1 ด้านขวา
รันคำสั่งด้านล่างนี้และคลิกปุ่มRun
เพื่อเรียกดูข้อมูลใน S3
select * from "tinnakorn_test_s3"
เลื่อนลงมาด้านล่างที่หัวข้อ Results จะเห็นข้อมูล JSON แสดงขึ้นมา
ให้สังเกตที่ datetime ซึ่งเวลาจะไม่เรียงให้
รันคำสั่งด้านล่างนี้และคลิกปุ่มRun
เพื่อเรียกดูข้อมูลใน S3 โดยเรียง datetime จากมากไปน้อย
select * from "tinnakorn_test_s3" order by datetime desc
เลื่อนลงมาด้านล่างที่หัวข้อ Results จะเห็นข้อมูล JSON แสดงขึ้นมา
ให้สังเกตที่ datetime ซึ่งเวลาจะเรียงให้จากมากไปน้อย
รันคำสั่งด้านล่างนี้และคลิกปุ่มRun
เพื่อตรวจสอบข้อมูล distance ที่ใหญ่ที่สุด
select max(distance) from "tinnakorn_test_s3"
เลื่อนลงมาด้านล่างที่หัวข้อ Results จะเห็นข้อมูล JSON แสดงขึ้นมา
ซึ่งจะแสดงข้อมูลที่ใหญ่ที่สุดของ distance
รันคำสั่งด้านล่างนี้และคลิกปุ่มRun
เพื่อดูข้อมูลของ S3 ทั้งหมดโดยการนับออกมาเป็นตัวเลข
select count(*) from "tinnakorn_test_s3"
เลื่อนลงมาด้านล่างที่หัวข้อ Results จะเห็นข้อมูล JSON แสดงขึ้นมา
ซึ่งเลข 22 นี้คือจำนวนไฟล์ที่นับได้ทั้งหมดในขณะที่ทำการตรวจสอบ
การทำงาน S3 Bucket สำหรับ Athena
เข้ามาที่ S3 Bucket ที่ใช้สำหรับ Athena ในตัวอย่างนี้คือtinnakorn-test-athena-result
จะเห็นว่ามีไฟล์.csv
และ.csv.metadata
อยู่ครับ
ขั้นตอนนี้ผมจะลองดาวน์โหลดไฟล์.csv
มาดูข้อมูลข้างในครับ ซึ่งก่อนดาวน์โหลดแนะนำให้คลิกที่Last modified ▽
จนเป็นสัญลักษณ์Last modified ▼
แบบนี้ แล้ว datetime ก็จะเรียงให้เรา จากนั้นให้เลือกดาวน์โหลดในเวลาล่าสุดที่มีการรันคำสั่ง "count" ใน Athena ไปเมื่อสักครู่นี้ครับ
วิธีการดาวโหลดง่ายๆ เลยครับ ติ๊ก✅
ไฟล์ที่ต้องการดาวน์โหลด และคลิกปุ่มDownload
ลองเปิดไฟล์.csv
ขึ้นมา จะเห็นว่าเป็นผลลัพธ์ของการรันคำสั่ง count ไปเมื่อสักครู่นี้ครับ
ไฟล์ต่อไปที่จะดาวน์โหลดคือไฟล์.csv.metadata
ให้ดาวน์โหลดเหมือนขั้นตอนที่แล้วโดยติ๊ก✅
ไฟล์ที่ต้องการดาวน์โหลด และคลิกปุ่มDownload
ได้เลยครับ
ลองเปิดไฟล์.csv.metadata
ขึ้นมา จะเห็นว่าเป็น Log ที่เก็บข้อมูลของการรันคำสั่ง count ไปเมื่อสักครู่นี้ครับ
หมายเหตุ: ถ้าเปิดไฟล์
.csv.metadata
ใน Notepad ของ Windows ตัวหนังสืออาจเป็นภาษาต่างดาว แนะนำให้โหลดโปรแกรม Downloads | Notepad++ นี้มาเปิดดูครับ
ในส่วนของหัวข้อ 3. รัน SQL สำหรับ Table (Amazon Athena) นี้ก็เสร็จเรียบร้อยแล้ว ผมจะทบทวนสิ่งที่ได้ทำในหัวข้อนี้อีกครั้งครับ
- สิ่งที่ได้ทำไปแล้วในหัวข้อ 3. รัน SQL สำหรับ Table (Amazon Athena)
- สร้าง S3 Bucket เพื่อบันทึกข้อมูลการรันคำสั่งของ Athena
- สร้าง Workgroups ขึ้นมาเชื่อมต่อกับ S3 Bucket ที่ใช้สำหรับ Athena
- ตั้งค่า Query editor เพื่อเตรียมการรัน SQL สำหรับ Table
- ทดสอบการใช้งาน SQL ใน Query editor
ขั้นตอนการทำทั้งหมดของบทความนี้คือ การรัน SQL ไปยังไฟล์ใน S3 ด้วย Glue กับ Athena ก็ได้สิ้นสุดลงที่หัวข้อนี้ครับ
หมายเหตุ: สำหรับคนที่ต้องการนำวิธีนี้ไปใช้งานต่อในบทความอื่นก็ไม่ต้องทำการลบ AWS Resource !
แต่ถ้าไม่ต้องการใช้งานแล้วให้ทำการลบโดยทำตามหัวข้อถัดไปได้เลยครับ
4. ทำวิธีการลบ AWS Resource ที่สร้างขึ้นในบทความนี้
การลบฟังก์ชันที่ได้สร้างขึ้นใน Service ต่างๆ
ลบตามขั้นตอนดังนี้:
- Amazon EC2
- Key Pairs
- Instance
- Security Groups
- Amazon Athena
- Workgroups
- AWS Glue
- Databases
- Tables
- Crawlers
- Amazon S3
- Buckets (2)
- AWS Identity and Access Management (IAM)
- Roles (2)
การลบฟังก์ชันใน Service ต่างๆ ถ้าเราไม่รู้ลำดับของการลบฟังก์ชันก็จะทำให้เกิด Error ในขณะลบ หรือไม่สามารถลบได้นั่นเอง เช่น ถ้าทำการลบ Security Group ที่กำลังเชื่อมต่ออยู่กับ EC2 โดยที่ไม่ Terminate EC2 ก่อน ก็จะไม่สามารถลบ Security Group ได้ เป็นต้น ดังนั้นแนะนำให้ลบตามขั้นตอนที่ผมเรียงไว้ได้เลยครับ
การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2
ดูตัวอย่างการลบที่นี่: การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2
การลบ Workgroups ใน Amazon Athena
เข้ามาที่ 「 Service Athena » Workgroups 」 แล้วทำการลบ
การลบ Crawlers และ Databases ใน AWS Glue
- Crawlers
เข้ามาที่ 「 Service AWS Glue » Crawlers 」 แล้วทำการลบ
- Databases
เข้ามาที่ 「 Service AWS Glue » Databases 」 แล้วทำการลบ (เมื่อลบเสร็จแล้ว Tables ก็จะถูกลบออกเองโดยอัตโนมัติ)
การลบ Buckets ใน Amazon S3
การลบ Buckets นี้ต้องลบออกทั้งหมด 2 อัน ซึ่งจะมี Bucket ที่ใช้กับ EC2 และ Athena ครับ
ดูตัวอย่างการลบที่นี่: การลบ Buckets ใน Amazon S3
การลบ Role และ Policies ใน IAM
การลบ Role นี้ต้องลบออกทั้งหมด 2 อัน ซึ่งจะมี Role ที่ใช้กับ EC2 และ AWS Glue ครับ
ดูตัวอย่างการลบที่นี่: การลบ Role และ Policies ใน IAM
สรุป
การสาธิตครั้งนี้เป็นการอธิบายโดยจะเน้นมาที่การใช้งาน Service AWS Glue และ Athena เป็นหลัก
AWS Glue มีหน้าที่ในการค้นหา จัดเตรียม และรวมข้อมูลสำหรับการวิเคราะห์ โดยการผสานรวมข้อมูลที่เรียบง่าย ปรับขนาดได้ และไร้เซิร์ฟเวอร์ ซึ่งผมได้นำมาใช้กับ Service Athena และ S3 ในครั้งนี้ครับ
Amazon Athena มีหน้าที่ในการสืบค้นแบบโต้ตอบที่ช่วยให้ง่ายต่อการวิเคราะห์ข้อมูลใน Amazon S3 โดยใช้ SQL มาตรฐาน Athena ไร้เซิร์ฟเวอร์ ซึ่งผมได้นำมาใช้งานกับ Service AWS Glue และ S3 โดยการรันคำสั่ง SQL เพื่อเรียกดูข้อมูลใน S3 ครับ
การใช้งานโดยรวมคือ AWS Glue สามารถค้นหา วิเคราะห์ข้อมูลใน S3 เพื่อตัดสินใจในการผสานรวมข้อมูลหรือสร้างตารางออกมาตามรูปแบบของฐานข้อมูลของ S3 อย่างรวดเร็ว และ Athena ก็สามารถจัดการฐานข้อมูลโดยการรันคำสั่ง SQL ที่ได้รับการผสานรวมข้อมูลมาจาก AWS Glue ได้อย่างรวดเร็วเช่นเดียวกันครับ